// C++ Templates: 第十四章 实例化
// 14.1 按需实例化
// 第14章讨论了C++模板的实例化过程，而14.1节特别关注"按需实例化"(On-demand Instantiation)机制，这是C++模板系统的一个核心特性。

// 按需实例化的基本概念(不是编译期条件选择)
// 按需实例化是指C++编译器只会为程序中实际使用的模板和模板成员生成代码，而不是为所有可能的模板成员生成代码。
// 这种机制有几个重要特点：
// 1.延迟实例化：模板代码只有在被使用时才会被实例化
// 2.部分实例化：只有被使用的模板成员会被实例化
// 3.上下文相关：实例化发生在使用模板的上下文中

// 实例化的触发条件
// 1.创建模板类的对象：
std::vector<int> v; // 触发std::vector<int>的实例化

// 2.调用模板函数：
auto result = max(10, 20); // 触发max<int>的实例化

// 3.取模板成员的地址：
auto ptr = &MyClass<int>::foo; // 触发MyClass<int>::foo的实例化

// 4.使用模板类的静态成员：
int value = MyClass<double>::staticValue; // 触发静态成员的实例化

// 部分实例化的例子
template <typename T>
class Container
{
public:
    void add(const T &item);
    T get(int index) const;
    void remove(int index);
    int size() const;
};

void foo()
{
    Container<int> c;
    c.add(42);
    int x = c.get(0);
    int s = c.size();

    // 注意：remove方法未被使用，因此不会被实例化
}
// Container<int>::add被实例化，因为它被调用了
// Container<int>::get被实例化，因为它被调用了
// Container<int>::size被实例化，因为它被调用了
// Container<int>::remove不会被实例化，因为它没有被使用

// 按需实例化的优势
// 1.减少编译时间：只编译实际需要的代码
// 2.减少可执行文件大小：不生成未使用的代码
// 3.允许使用不完整类型：只要不使用依赖于完整类型的成员
// 4.支持SFINAE：允许某些模板特化在实例化时失败而不报错